package com.dkts.oil.router.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dkts.oil.config.OilConfig;
import com.dkts.oil.converter.GeometryConverter;
import com.dkts.oil.exception.OilException;
import com.dkts.oil.model.GHPoint;
import com.dkts.oil.router.RouteStrategy;
import com.dkts.oil.router.TransportRoute;
import com.dkts.oil.router.param.RouterInfo;
import com.dkts.oil.util.HttpUtils;
import com.dkts.oil.web.vo.request.RouteCommonRequest;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 1.1.2.2.4 储备库到消耗库运输路线规划
 功能名称	储备库到消耗库运输路线规划	功能标识	CADS_02_001
 功能描述	根据储备库位置、消耗库位置规划储备库到消耗库公路运输路线，在GIS地图上展示规划路线，估计运输用时，生成并显示储备库到消耗库公路运输规划说明
 输入	储备库位置、消耗库位置、消耗库是否在机场内部
 处理逻辑	1）	规划从储备库到消耗库的公路运输路线，如果消耗库没有公路直接连接，需要在附近公路找到一个最佳点，规划出一条该点到消耗库的公路运输路线，在规划公路时需要考虑路线规划约束条件。如果消耗库在机场内部，直接规划一条到靠近消耗库机场大门的路线
 2）	规划完成后规划完成后保存路线规划结果，并在GIS地图上展示规划路线，已有公路与新建公路采用不同线路样式进行标识
 3）	计算运输用时，并生成路线规划说明


 CBK到XHK规划逻辑：
 若XHK在机场外部，需规划第一、二、三段
 第一段：CBK——>最佳点A（已有公路上）【新增路线】
 第二段：最佳点A（已有公路上）——>最佳点B（已有公路上）【已有路线】
 第三段：最佳点B（已有公路上）——>XHK【新增路线】
 若XHK在机场内部，需规划第一、二、三段（如果是内部只规划到机场大门的路线，在机场设计条件增加大门的位置坐标）
 第一段：CBK——>最佳点A（已有公路上）【新增路线】
 第二段：最佳点A（已有公路上）——>最佳点B（已有公路上）【已有路线】
 第三段：最佳点B（已有公路上）——>机场大门【新增路线】

 */
@Service("CBK_TO_XHK")
@Slf4j
public class CbkTOXHKStrategy extends RouterCommonHelper implements RouteStrategy<RouteCommonRequest, RouterInfo> {

    @Autowired
    private OilConfig oilConfig;
    @Override
    public RouterInfo planRoute(RouteCommonRequest param) {


//        若XHK在机场外部，需规划第一、二、三段
//        第一段：CBK——>最佳点A（已有公路上）【新增路线】
//        第二段：最佳点A（已有公路上）——>最佳点B（已有公路上）【已有路线】
//        第三段：最佳点B（已有公路上）——>XHK【新增路线】
//        若XHK在机场内部，需规划第一、二、三段（如果是内部只规划到机场大门的路线，在机场设计条件增加大门的位置坐标）
//        第一段：CBK——>最佳点A（已有公路上）【新增路线】
//        第二段：最佳点A（已有公路上）——>最佳点B（已有公路上）【已有路线】
//        第三段：最佳点B（已有公路上）——>机场大门【新增路线】
        Geometry geometry = check(param, TransportRoute.CBK_TO_XHK);
        List<GHPoint> points = param.getPoints();
        int row=points.size();

        Geometry pont=GeometryConverter.locationtechGeometryFactory.createPoint(new Coordinate(points.get(row-1).getLon(), points.get(row-1).getLat()));

        // 若XHK在机场内部，需规划第一、二、三段（如果是内部只规划到机场大门的路线，在机场设计条件增加大门的位置坐标）
        if (geometry.contains( pont)){
            points.remove(row-1);
            points.add(param.getAirportDoorPoint());
        }

        JSONObject result = this.getRouteParam(param.getPoints(), "car");
        JSONArray data = HttpUtils.postRouteOil(oilConfig.getHighwayUrl() + "/route", JSONObject.toJSONString( result), param.getPoints());
        return parseAllRouteSegments(data, param.getRouteModel(),1,param.getCreateNewRoadDistance(),2,param.getLocalRouteDistance());
    }
}
